home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 7 / FM Towns Free Software Collection 7.iso / t_os / artemis / artsrc1 / artemis.c < prev    next >
Encoding:
C/C++ Source or Header  |  1993-11-30  |  12.5 KB  |  508 lines

  1. /*
  2.     ARTemis (Graphic Editor for FM-TOWNS)
  3.     (c) MATSUUCHI Ryosuke 1992
  4.  
  5.     artemis.c
  6. */
  7.  
  8. // #define DEBUG
  9.  
  10. #include <stdio.h>
  11. #include <string.h>
  12. #include <ctype.h>
  13. #include <stdlib.h>
  14. #include <egb.h>
  15. #include <mos.h>
  16. #include <stdarg.h>
  17.  
  18. #define    MODULE_MAIN
  19. #include "ge.h"
  20. #include "plt16.h"
  21. #include "imageman.h"
  22. #include "dispman.h"
  23. #include "mask.h"
  24. #include "mainmenu.h"
  25.  
  26. /*--------------------------------------------------------*/
  27. /*                        変数宣言                        */
  28. /*--------------------------------------------------------*/
  29.  
  30.  
  31. int        mode;                // MODE16, MODE32K
  32. int        white = 32767;        // 画面モード scrmode での「白」色を表す色コード
  33. int        minzoomrate = 1;    // 拡大率の最小値
  34.  
  35. int        pltnum;
  36.                 // 現在選択しているパレットの番号(0..15)
  37.                 // 16色編集時は、これがそのまま描画色になるが、
  38.                 // 3万色編集時には、plt[pltnum] が描画色である。
  39.  
  40. MSDAT    ms = {0,0,0,0,OFF,OFF};
  41.                 // マウスの状態(座標・ボタン)をあらわす。
  42.                 // ms_get により設定される。
  43.  
  44. int        mixrate = 256;            // 描画濃度
  45. int        blkop = DrawNORMAL;        // コピー/矩形描画時の演算
  46. bool    blkop_edge = YES;        // 3万色編集でのコピー時の黒透過境界補正スイッチ
  47. bool    areaadj = NO;            // 範囲指定時に、座標を大格子上に限定するスイッチ
  48. int        blot_depth = 16;        // にじみペン手続きの再帰回数
  49. int        goshi_para = 128;        // こすりペンのこすれやすさ(0..256)
  50. int        spray_r = 8;            // スプレー半径
  51. int        spray_t = 1;            // スプレー種別 0:ドット, 1:ペン先
  52. int        colmodel = MODEL_RGB;    // 色選びの方法 (MODEL_RGB / MODEL_HLS)
  53. int        csrcol;                    // カーソルの色
  54. int        whiteback = NO;            // 起動時の背景色(YES:白  NO:黒)
  55. bool    use_partsave = YES;        // 部分セーブ機能を使うかどうか
  56. bool    use_loadmove = YES;        // ロード位置指定機能を使うかどうか
  57. int        forecol, backcol;
  58. int        font12seg;                // 12dot font が存在するセグメント
  59. char    debugmsg[128];            // デバッグメッセージの出力バッファ
  60.  
  61.  
  62. bool    ryosuke = NO;            // 作者専用オプションが指定されたかどうか
  63. bool    ryosuke_pat = NO;        // 作者専用オプション2が指定されたかどうか
  64.  
  65. bool    debug = NO;                // デバッグスイッチ
  66.  
  67.  
  68. static    int        _editxlen,_editylen;
  69. static    bool    _lat1disp,_lat2disp;
  70. static    bool    _lat2xlen,_lat2ylen;
  71. static    int        _zoomrate;
  72.  
  73.  
  74. /*--------------------------------------------------------*/
  75. /*               デバッグ用メッセージの出力               */
  76. /*--------------------------------------------------------*/
  77.  
  78.  
  79. void debug_msg_dummy(char *format, ...)
  80. {
  81.     return;
  82. }
  83.  
  84. void debug_msg(char *format, ...)
  85. {
  86.     extern void colspc_debugmsg(char *buf);
  87.     char sbuf[200];
  88.     if (!debug)
  89.         return;
  90.     va_list ap;
  91.     va_start(ap, format);
  92.     FILE *fp;
  93.     fp = fopen("msg","a");
  94.     if (fp!=NULL)
  95.     {
  96.         vfprintf(fp,format, ap);
  97.         fclose(fp);
  98.     }
  99.     va_end(ap);
  100. }
  101.  
  102.  
  103. void msgout_abs(char *msg)
  104. {
  105.     FILE *fp;
  106.     fp = fopen("msg","a");
  107.     if (fp!=NULL)
  108.     {
  109.         fprintf(fp,"%s\n",msg);
  110.         fclose(fp);
  111.     }
  112. }
  113.  
  114.  
  115. void msgout(char *msg)
  116. {
  117.     if (debug)
  118.         msgout_abs(msg);
  119. }
  120.  
  121. /*--------------------------------------------------------*/
  122. /*                 変数の初期化・チェック                 */
  123. /*--------------------------------------------------------*/
  124.  
  125.  
  126. static int initVar()
  127. {
  128.     int i;
  129.     mode = MODE32K;
  130.     pltnum=PLTNUM-1;
  131.     white = 32767;
  132.     colmodel = MODEL_RGB;
  133.     csrcol = COL_cursorLight;
  134.     _editxlen = 320, _editylen = 240;
  135.     _lat1disp = _lat2disp = NO;
  136.     _lat2xlen = _lat2ylen = 16;
  137.     _zoomrate = 2;
  138.     mixrate = 256;
  139.     extern int mma_allocSeg(char* segname);
  140.     font12seg = mma_allocSeg("FONT");
  141.     return 0;
  142. }
  143.  
  144.  
  145.  
  146. static void checkPara()    // 動作状態設定に矛盾があれば直す
  147. {
  148.     minzoomrate = 1;
  149.     if (mode == MODE32K)
  150.     {
  151.         if (_editxlen < 320)
  152.             _editxlen = 320;
  153.         else if (_editylen < 240)
  154.             _editylen = 240;
  155.         if (_editxlen < 512 || _editylen < 480)
  156.             minzoomrate = 2;
  157.     }
  158.     if (_zoomrate < minzoomrate)
  159.         _zoomrate = minzoomrate;
  160. }
  161.  
  162.  
  163.  
  164. static int initIO()
  165. {
  166.     static    int        _plt32K[] =
  167.         { 0, 0, GRB(21, 0, 0), GRB(31,20,10),
  168.           GRB( 0, 0,31), GRB(13, 5,31), GRB( 0,22, 0), GRB(23, 3,31),
  169.           GRB( 6,31, 0), GRB(16,31, 5), GRB(31,31, 0), GRB(23,31,19),
  170.           GRB(10, 0, 0), GRB( 0,31,31), GRB(14,14,14), GRB(31,31,31) };
  171.     static    int        _plt16[] =
  172.         { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15 };
  173.  
  174.     DMnew(0);
  175.     key_init();
  176.     minit();
  177.     MOS_resolution(0,(DMgetifonepage() ? 17 : 3));
  178.     MOS_writePage(0);
  179.  
  180.     int_init();
  181.     plt_init();
  182.     if (!DMgetifonepage())
  183.     {
  184.         page_edit();
  185.         #if 0
  186.         if (mode == MODE32K)
  187.             memcpy(plt, _plt32K, sizeof(int)*16);
  188.         else if (mode == MODE16)
  189.         {
  190.             memcpy(plt, _plt16, sizeof(int)*16);
  191.             if (plt16_init() != 0)    exit(0);
  192.         }
  193.         #endif
  194.         page_menu();
  195.     }
  196.     else
  197.     {
  198.         #if 0
  199.         if (mode == MODE32K)
  200.             memcpy(plt, _plt32K, sizeof(int)*16);
  201.         else if (mode == MODE32K)
  202.         {
  203.             memcpy(plt, _plt16, sizeof(int)*16);
  204.             if (plt16_init() != 0)    exit(0);
  205.         }
  206.         #endif
  207.     }
  208.     return 0;
  209. }
  210.  
  211.  
  212. /*--------------------------------------------------------*/
  213. /*                     画面の初期描画                     */
  214. /*--------------------------------------------------------*/
  215.  
  216.  
  217. static void iniScr()
  218. {
  219.     DEBUG_MSG("iniScr begin");
  220.     if (whiteback)
  221.     {
  222.         EIMrboxfill(0,0,EIMgetxsize(),EIMgetysize(),white,DrawNORMAL);
  223.         forecol = 0,  backcol = white;
  224.     }
  225.     else
  226.         forecol = white,  backcol = 0;
  227.     DEBUG_MSG("(iniScr) --- A");
  228.     DMimage_setzoomrate(_zoomrate);
  229.     DMimage_setlatticeswitch(_lat1disp,_lat2disp);
  230.     DMimage_setlatticesize(_lat2xlen,_lat2ylen);
  231.     DEBUG_MSG("(iniScr) --- B");
  232.     DEBUG_MSG("iniScr end");
  233. }
  234.  
  235.  
  236. /*--------------------------------------------------------*/
  237. /*                 設定ファイルの読み書き                 */
  238. /*--------------------------------------------------------*/
  239.  
  240.  
  241. #define    CFG_NAME    "artemis.cfg"
  242. static char config_fname[128] = {0};
  243.  
  244.  
  245. static void loadConfig()
  246. {
  247.     _searchenv(CFG_NAME, "PATH", config_fname);
  248.     if (config_fname[0] == 0)
  249.     {
  250.         _searchenv(CFG_NAME, "PATH386", config_fname);
  251.         if (config_fname[0] == 0)
  252.             return; // ファイルが存在しない
  253.     }
  254.     FILE *fp;
  255.     if ((fp = fopen(config_fname, "r")) == NULL)
  256.         return;        // たぶんありえない
  257.     char linbuf[256];
  258.     while (fgets(linbuf, 256, fp) != NULL)
  259.     {
  260.         static char limits[] = " \t\n.,:;=";
  261.         char *p;
  262.         if ((p = strtok(linbuf,limits)) == NULL)
  263.             continue;
  264.         if (strcmp(p, "zoomrate") == 0)
  265.             _zoomrate = atoi(strtok(NULL,limits));
  266.         else if (strcmp(p, "lattice1") == 0)
  267.             _lat1disp = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  268.         else if (strcmp(p, "lattice2") == 0)
  269.             _lat2disp = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  270.         else if (strcmp(p, "lat2size") == 0)
  271.         {
  272.             _lat2xlen = atoi(strtok(NULL,limits));
  273.             _lat2ylen = atoi(strtok(NULL,limits));
  274.         }
  275.         else if (strcmp(p, "mixrate") == 0)
  276.             mixrate = atoi(strtok(NULL,limits));
  277.         else if (strcmp(p, "blkop") == 0)
  278.             blkop = atoi(strtok(NULL,limits));
  279.         else if (strcmp(p, "blkop_edge") == 0)
  280.             blkop_edge = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  281.         else if (strcmp(p, "areaadj") == 0)
  282.             areaadj = (strcmp(strtok(NULL,limits),"on") == 0 ? YES : NO);
  283.         else if (strcmp(p, "blot_para") == 0)
  284.             blot_depth = atoi(strtok(NULL,limits));
  285.         else if (strcmp(p, "goshi_para") == 0)
  286.             goshi_para = atoi(strtok(NULL,limits));
  287.         else if (strcmp(p, "spray_r") == 0)
  288.             spray_r = atoi(strtok(NULL,limits));
  289.         else if (strcmp(p, "spray_t") == 0)
  290.             spray_t = atoi(strtok(NULL,limits));
  291.         else if (strcmp(p, "colmodel") == 0)
  292.             colmodel = atoi(strtok(NULL,limits));
  293.         else if (strcmp(p, "csrcol") == 0)
  294.             csrcol = atoi(strtok(NULL,limits));
  295.         else if (strcmp(p, "backcol") == 0)
  296.             whiteback = (strcmp(strtok(NULL,limits),"white") == 0 ? YES : NO);
  297.         else if (strcmp(p, "partsave") == 0)
  298.             use_partsave = (strcmp(strtok(NULL,limits),"YES") == 0 ? YES:NO);
  299.         else if (strcmp(p, "loadmove") == 0)
  300.             use_loadmove = (strcmp(strtok(NULL,limits),"YES") == 0 ? YES:NO);
  301.     }
  302.     fclose(fp);
  303. }
  304.  
  305.  
  306. static void saveConfig()
  307. {
  308.     if (config_fname[0] == 0)
  309.         strcpy(config_fname,CFG_NAME);
  310.     if (fexist(config_fname))
  311.     {
  312.         if (resetfattr(config_fname) != 0)
  313.             return;
  314.     }
  315.     FILE *fp;
  316.     if ((fp = fopen(config_fname,"w")) == NULL)
  317.         return;
  318.     fprintf(fp, "zoomrate   %d\n", DMimage_getzoomrate());
  319.     bool f1,f2;
  320.     int t1,t2;
  321.     DMimage_getlatticeswitch(&f1,&f2);
  322.     fprintf(fp, "lattice1   %s\n", (f1 ? "on":"off"));
  323.     fprintf(fp, "lattice2   %s\n", (f2 ? "on":"off"));
  324.     DMimage_getlatticesize(&t1,&t2);
  325.     fprintf(fp, "lat2size   %d %d\n", t1, t2);
  326.     fprintf(fp, "mixrate    %d\n", mixrate);
  327.     fprintf(fp, "blkop      %d\n", blkop);
  328.     fprintf(fp, "blkop_edge %s\n", (blkop_edge ? "on":"off"));
  329.     fprintf(fp, "areaadj    %s\n", (areaadj ? "on":"off"));
  330.     fprintf(fp, "blot_para  %d\n", blot_depth);
  331.     fprintf(fp, "goshi_para %d\n", goshi_para);
  332.     fprintf(fp, "spray_r    %d\n", spray_r);
  333.     fprintf(fp, "spray_t    %d\n", spray_t);
  334.     fprintf(fp, "colmodel   %d\n", colmodel);
  335.     fprintf(fp, "csrcol     %d\n", csrcol);
  336.     fprintf(fp, "backcol    %s\n", (whiteback ? "white":"black"));
  337.     fprintf(fp, "partsave   %s\n", (use_partsave ? "YES" : "NO"));
  338.     fprintf(fp, "loadmove   %s\n", (use_loadmove ? "YES" : "NO"));
  339.     fclose(fp);
  340. }
  341.  
  342.  
  343. /*--------------------------------------------------------*/
  344. /*                    オプション読込                      */
  345. /*--------------------------------------------------------*/
  346.  
  347.  
  348. static void getOption(int argc, char *argv[])
  349. {
  350. #define    error_exit(msg)  { printf("%s\n",(msg)); exit(0); }
  351.     char c;
  352.     int i,n;
  353.     char *p;
  354.     for (i=1; i<argc; i++)
  355.     {
  356.         p = argv[i];
  357.         if (*p == '-')
  358.         {
  359.             p++;
  360.             c = tolower(*p);
  361.             switch (c)
  362.             {
  363.             case '0'..'9':
  364.                 n = atoi(p);
  365.                 switch (n)
  366.                 {
  367.                 case 16:        // 16 色モード
  368.                     // scrmode = 3;
  369.                     white = 15;
  370.                     // editXlen = 640, editYlen = 480;
  371.                     break;
  372.                 case 32:        // 3万色モード
  373.                     mode = MODE32K;
  374.                     white = 32767;
  375.                     _editxlen = 320, _editylen = 240;
  376.                     break;
  377.                 case 3232:        // 3万色モード、高解像度編集
  378.                     mode = MODE32K;
  379.                     white = 32767;
  380.                     _editxlen = 512, _editylen = 480;
  381.                     // menumode = 1;
  382.                     break;
  383.                 case 1616:        // 16色モード、2048×2048ドット編集
  384.                     // scrmode = 3;
  385.                     white = 15;
  386.                     // editXlen = 2048, editYlen = 2048;
  387.                     break;
  388.                 default:
  389.                     error_exit("無効な画面モードです。");
  390.                 }
  391.                 break;
  392.             case 'x':
  393.                 n = atoi(p+1);
  394.                 if (n < 1)
  395.                     error_exit("編集範囲のX方向長の指定が小さすぎます。");
  396.                 _editxlen = n;
  397.                 break;
  398.             case 'y':
  399.                 n = atoi(p+1);
  400.                 if (n < 1)
  401.                     error_exit("編集範囲のY方向長の指定が小さすぎます。");
  402.                 _editylen = n;
  403.                 break;
  404.             case 'd':
  405.                 debug = YES;
  406.                 break;
  407.             case 'r':
  408.                 if (strncmp(p, "rio2", 4) == 0)
  409.                     ryosuke_pat = YES;
  410.                 else if (strncmp(p, "rio", 3) == 0)
  411.                     ryosuke = YES;
  412.                 break;
  413.             case 'm':    // メニューモード
  414.                 // menumode = atoi(p+1);
  415.                 break;
  416.             case 'h':
  417.             case '?':
  418.                 printf("\
  419. ARTemis version 1.2  (C)1993 MATSUUCHI Ryosuke\n\
  420. 起動方法: run386 artemis [オプション]\n\
  421. オプション:\n\
  422.     -x<n>    画像の横方向のドット数\n\
  423.     -y<n>    画像の縦方向のドット数\n\
  424.     -h / -?  このメッセージの表示\n\
  425. ");
  426.                 exit(0);
  427.             }
  428.         }
  429.     }
  430. #undef error_exit
  431. }
  432.  
  433.  
  434. /*--------------------------------------------------------*/
  435. /*              オプション設定に従った初期化              */
  436. /*--------------------------------------------------------*/
  437.  
  438.  
  439. static int setupAsPara()
  440. {
  441.     pltnum = (whiteback ? 0 : PLTNUM-1);
  442.     if (_editxlen >= 512 && _editylen >= 480 && _zoomrate == 2)
  443.         _zoomrate = 1;
  444.     if (EIMnew(0,_editxlen,_editylen) != 0)
  445.         return -1;
  446.     return 0;
  447. }
  448.  
  449.  
  450. /*--------------------------------------------------------*/
  451. /*                         メイン                         */
  452. /*--------------------------------------------------------*/
  453.  
  454.  
  455. int main(int argc, char *argv[])
  456. {
  457.     if (initVar() != 0)
  458.     {
  459.         printf("メモリが不足しています(1)\n");
  460.         exit(0);
  461.     }
  462.     loadConfig();
  463.     getOption(argc, argv);
  464.     checkPara();
  465.     if (setupAsPara() != 0)
  466.     {
  467.         printf("メモリが不足しています(2)\n");
  468.         exit(0);
  469.     }
  470.     DEBUG_MSG("-------- ARTemis start --------");
  471.     if (cbuf_init() != 0 ||
  472.         TIFFinitwork() != 0 || area_init() != 0 || filemenu_init() != 0 ||
  473.         mask_init() != 0 || spray_init() != 0 || mathtbl_init() != 0 ||
  474.         pen_init() != 0)
  475.     {
  476.         printf("メモリが不足しています(3)\n");
  477.         exit(0);
  478.     }
  479.     loadPenData();
  480.     menu_init();
  481.     DEBUG_MSG("menu_init 終了");
  482.     if (initIO() != 0)
  483.     {
  484.         printf("メモリが不足しています(4)\n");
  485.         exit(0);
  486.     }
  487.     DEBUG_MSG("initIO 終了");
  488.     iniScr();
  489.     DEBUG_MSG("iniScr 終了");
  490.     ARTsetintvector();
  491.     DEBUG_MSG(debugmsg);
  492.  
  493.     do_mainmenu();
  494.  
  495.     saveConfig();
  496.     int_end();
  497.     mend();
  498.     DMdelete();
  499.     filemenu_end();
  500.     menu_end();
  501.     pen_end();
  502.     ARTresetintvector();
  503.     mma_freeSeg(font12seg);
  504.     return 0;
  505. }
  506.  
  507. /* end of artemis.c */
  508.